package com.service.utility.common;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.math.BigDecimal;
import java.math.RoundingMode;

/**
 * @version $Id: MathUtil.java, v 0.1
 */
@Slf4j
public class MathUtil {


    /**
     * 加法
     */
    public static BigDecimal add(BigDecimal a, BigDecimal b, int scale, int roundingMode) {
        return a.add(b).setScale(scale, roundingMode);
    }

    /**
     * 加法
     */
    public static BigDecimal add(BigDecimal a, BigDecimal b, int scale) {
        return a.add(b).setScale(scale, BigDecimal.ROUND_HALF_UP);
    }

    /**
     * 减法
     */
    public static BigDecimal sub(BigDecimal a, BigDecimal b) {
        return a.subtract(b);
    }

    /**
     * 减法
     */
    public static BigDecimal subAndZero(BigDecimal a, BigDecimal b) {
        return a.compareTo(b) >= 0 ? sub(a, b) : BigDecimal.ZERO;
    }

    /**
     * 减法
     */
    public static BigDecimal sub(BigDecimal a, BigDecimal b, int scale) {
        return a.subtract(b).setScale(scale);
    }

    /**
     * 减法
     */
    public static BigDecimal sub(BigDecimal a, BigDecimal b, int scale, int roundingMode) {
        return a.subtract(b).setScale(scale, roundingMode);
    }

    /**
     * 乘法
     */
    public static BigDecimal mul(BigDecimal a, BigDecimal b, int scale, int roundingMode) {
        return a.multiply(b).setScale(scale, roundingMode);
    }

    /**
     * 乘法
     */
    public static BigDecimal mul(BigDecimal a, BigDecimal b, int scale) {
        return a.multiply(b).setScale(scale, BigDecimal.ROUND_HALF_UP);
    }

    /**
     * 乘法
     */
    public static BigDecimal mul(BigDecimal a, BigDecimal b) {
        return a.multiply(b);
    }

    /**
     * 乘法，4位以后四舍五入
     */
    public static BigDecimal mulAndKeep4BitDecimalNormal(BigDecimal a, BigDecimal b) {
        return keep4BitDecimalNormal(a.multiply(b));
    }

    /**
     * 乘法，4位以后舍掉
     */
    public static BigDecimal mulAndKeep4BitDecimal(BigDecimal a, BigDecimal b) {
        return keep4BitDecimal(a.multiply(b));
    }

    /**
     * 乘法
     */
    public static BigDecimal mul(BigDecimal a, Integer b) {
        return a.multiply(BigDecimal.valueOf(b));
    }

    /**
     * 除法
     */
    public static BigDecimal div(BigDecimal a, BigDecimal b, int scale, int roundingMode) {
        if (BigDecimal.ZERO.compareTo(b) == 0) {
            return BigDecimal.ZERO;
        }
        return a.divide(b, scale, roundingMode);
    }

    /**
     * 除法
     */
    public static BigDecimal div(BigDecimal a, BigDecimal b, int scale) {
        return div(a, b, scale, BigDecimal.ROUND_HALF_UP);
    }

    /**
     * 除法
     */
    public static BigDecimal div(BigDecimal a, BigDecimal b) {
        if (BigDecimal.ZERO.compareTo(b) == 0) {
            return BigDecimal.ZERO;
        }
        return a.divide(b, RoundingMode.HALF_UP);
    }

    public static BigDecimal parseBigDecimal(String value) {
        if (StringUtils.isBlank(value)) {
            throw new IllegalArgumentException("value is blank or not number");
        }
        return new BigDecimal(value);
    }


    /**
     * 保留4位小数,舍掉
     *
     * @param a
     * @return
     */
    public static BigDecimal keep4BitDecimal(BigDecimal a) {
        return a.setScale(4, BigDecimal.ROUND_DOWN);
    }

    /**
     * 保留4位小数并四舍五入
     *
     * @param a
     * @return
     */
    public static BigDecimal keep4BitDecimalNormal(BigDecimal a) {
        return a.setScale(4, BigDecimal.ROUND_HALF_UP);
    }

    /**
     * 保留8位小数并四舍五入
     *
     * @param a
     * @return
     */
    public static BigDecimal keep8BitDecimalNormal(BigDecimal a) {
        return a.setScale(8, BigDecimal.ROUND_HALF_UP);
    }

    /**
     * 保留4位小数，收上来
     *
     * @param a
     * @return
     */
    public static BigDecimal keep4BitDecimalUP(BigDecimal a) {
        return a.setScale(4, BigDecimal.ROUND_UP);
    }

    public static BigDecimal max(BigDecimal a, BigDecimal b){
        return a.compareTo(b) > 0 ? a : b;
    }

    public static boolean isLEZero(BigDecimal num) {
        return num.compareTo(BigDecimal.ZERO) <= 0;
    }
}